/**
 * ***************************************************************************** Copyright (c) 2003,
 * 2006 Subclipse project and others. All rights reserved. This program and the accompanying
 * materials are made available under the terms of the Eclipse Public License v1.0 which accompanies
 * this distribution, and is available at http://www.eclipse.org/legal/epl-v10.html
 *
 * <p>Contributors: Subclipse project committers - initial API and implementation
 * ****************************************************************************
 */
package org.tigris.subversion.subclipse.ui;

import java.text.MessageFormat;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;

public class Policy {
  public static boolean DEBUG_CONSOLE_BUFFERING = false;

  static {
    // init debug options
    if (SVNUIPlugin.getPlugin().isDebugging()) {
      DEBUG_CONSOLE_BUFFERING =
          "true"
              .equalsIgnoreCase(
                  Platform.getDebugOption(
                      SVNUIPlugin.ID + "/consolebuffering")); // $NON-NLS-1$ //$NON-NLS-2$
    }
  }

  private static final String BUNDLE_NAME =
      "org.tigris.subversion.subclipse.ui.messages"; //$NON-NLS-1$
  protected static ResourceBundle bundle = null;

  private static ResourceBundle getResourceBundle() {
    if (bundle == null) {
      bundle = ResourceBundle.getBundle(BUNDLE_NAME);
    }
    return bundle;
  }

  /**
   * Lookup the message with the given ID in this catalog and bind its substitution locations with
   * the given string.
   */
  public static String bind(String id, String binding) {
    return bind(id, new String[] {binding});
  }

  /**
   * Lookup the message with the given ID in this catalog and bind its substitution locations with
   * the given strings.
   */
  public static String bind(String id, String binding1, String binding2) {
    return bind(id, new String[] {binding1, binding2});
  }

  /**
   * Gets a string from the resource bundle. We don't want to crash because of a missing String.
   * Returns the key if not found.
   */
  public static String bind(String key) {
    try {
      return getResourceBundle().getString(key);
    } catch (MissingResourceException e) {
      return key;
    } catch (NullPointerException e) {
      return "!" + key + "!"; // $NON-NLS-1$ //$NON-NLS-2$
    }
  }

  /**
   * Gets a string from the resource bundle and binds it with the given arguments. If the key is not
   * found, return the key.
   */
  public static String bind(String key, Object[] args) {
    try {
      return MessageFormat.format(bind(key), args);
    } catch (MissingResourceException e) {
      return key;
    } catch (NullPointerException e) {
      return "!" + key + "!"; // $NON-NLS-1$ //$NON-NLS-2$
    }
  }

  /** Progress monitor helpers */
  public static void checkCanceled(IProgressMonitor monitor) {
    if (monitor.isCanceled()) throw new OperationCanceledException();
  }

  public static IProgressMonitor monitorFor(IProgressMonitor monitor) {
    if (monitor == null) return new NullProgressMonitor();
    return monitor;
  }

  public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks) {
    if (monitor == null) return new NullProgressMonitor();
    if (monitor instanceof NullProgressMonitor) return monitor;
    return new SubProgressMonitor(monitor, ticks);
  }

  public static IProgressMonitor subMonitorFor(IProgressMonitor monitor, int ticks, int style) {
    if (monitor == null) return new NullProgressMonitor();
    if (monitor instanceof NullProgressMonitor) return monitor;
    return new SubProgressMonitor(monitor, ticks, style);
  }
}
